/**
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 * $Id$ CarritoServices.java
 * Universidad de los Andes (Bogotá - Colombia)
 * Departamento de Ingeniería de Sistemas y Computación
 * Licenciado bajo el esquema Academic Free License version 2.1
 *
 * Ejercicio: Muebles los Alpes
 * Autor: German Sotelo
 * ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
 */
package com.losalpes.catalogo.servicios;

import com.losalpes.catalogo.entities.ItemCarrito;
import com.losalpes.catalogo.entities.Mueble;
import com.losalpes.catalogo.entities.RegistroVenta;
import com.losalpes.catalogo.entities.Usuario;
import com.losalpes.catalogo.excepciones.AccountException;
import com.losalpes.catalogo.excepciones.InvalidOperationException;
import java.util.ArrayList;
import java.util.Date;
import java.util.GregorianCalendar;
import javax.annotation.Resource;
import javax.ejb.EJB;
import javax.ejb.Remove;
import javax.ejb.SessionContext;
import javax.ejb.Stateful;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;
import javax.ejb.TransactionManagement;
import javax.ejb.TransactionManagementType;

/**
 * implementaciòn de los servicios que se prestan al cliente para administrar su carrito
 * @author German Sotelo
 */
@Stateful
@TransactionManagement(TransactionManagementType.CONTAINER)
public class CarritoServices implements ICarritoServicesLocal,ICarritoServicesRemote {

    /**
     * Unidad de persistencia de la aplicación
     */
    @EJB
    private IPersistenceServices persistenceServices;

    @Resource
    private SessionContext context;
    /**
     * Lista de items del carrito
     */
    private ArrayList<ItemCarrito> itemsCarrito = new ArrayList<ItemCarrito>();

    public CarritoServices() {
        
    }



    public void agregarAlCarrito(String id, int cantidad) {
        Mueble mueble = (Mueble)persistenceServices.findById(Mueble.class,new Long(id));
        ItemCarrito ic = new ItemCarrito();
        ic.setMueble(mueble);
        ic.setCantidad(cantidad);
        itemsCarrito.add(ic);
    }

    public void remove(String id){
        Long id2 = new Long(id);
        for(int e=0;e<itemsCarrito.size();e++){
            ItemCarrito ic = itemsCarrito.get(e);
            if(ic.getMueble().getReferencia().equals(id2)){
                itemsCarrito.remove(e);
                return;
            }
        }
    }

    public ArrayList<ItemCarrito> getItemsCarrito() {
        return itemsCarrito;
    }

    @Remove
    public void removeAll() {
        itemsCarrito=new ArrayList<ItemCarrito>();
    }

    @Remove
    public void pagarCarrito(Usuario user){
        GregorianCalendar gc = new GregorianCalendar();
        System.out.println(gc);
        Date d = gc.getGregorianChange();
        for(ItemCarrito ic:itemsCarrito){
            RegistroVenta registro = new RegistroVenta();
            registro.setCantidad(ic.getCantidad());
            registro.setProducto(ic.getMueble());
            registro.setFechaVenta(d);
            registro.setComprador(user);
            try {
                persistenceServices.create(registro);
            } catch (InvalidOperationException ex) {
            }
            Mueble m = (Mueble)persistenceServices.findById(Mueble.class,ic.getMueble().getReferencia());
            m.setCantidad(m.getCantidad()-ic.getCantidad());
            persistenceServices.update(m);
        }
        itemsCarrito=new ArrayList<ItemCarrito>();
    }

    /**
     * Paga el carrito con tarjeta
     * @param user
     */
    @Remove
    @TransactionAttribute(TransactionAttributeType.REQUIRED)
    public void pagarCarritoTC(Usuario user) {
        GregorianCalendar gc = new GregorianCalendar();
        System.out.println(gc);
        Date d = gc.getGregorianChange();
        float monto = 0;

        for(ItemCarrito ic:itemsCarrito){
            RegistroVenta registro = new RegistroVenta();
            registro.setCantidad(ic.getCantidad());
            registro.setProducto(ic.getMueble());
            registro.setFechaVenta(d);
            registro.setComprador(user);
            monto += ic.getCantidad() * ic.getMueble().getPrecio();
            try {
                persistenceServices.create(registro);
               
            } catch (InvalidOperationException ex) {
            }
            Mueble m = (Mueble)persistenceServices.findById(Mueble.class,ic.getMueble().getReferencia());
            m.setCantidad(m.getCantidad()-ic.getCantidad());
            persistenceServices.update(m);
        }
        itemsCarrito=new ArrayList<ItemCarrito>();
        try {
            System.out.println("Cuenta: " + user.getNumeroCuenta() );
            System.out.println("Monto: " + monto );
            persistenceServices.updateAccount(user.getNumeroCuenta(), monto);
        } catch (AccountException e ) {
            context.setRollbackOnly();
        }
        
       
    }



    public void agregarAlCarrito(Long id, int cantidad) {
        throw new UnsupportedOperationException("Not supported yet.");
    }



 
}
